Bibliographic Collection

Data source: Clarivate Analytics Web of Science (http://apps.webofknowledge.com)

Data format: Plaintext

Query: TO = “Capacitated Arc Routing” OR “Capacitated General Routing”

Timespan: 2010-2019

Document Type: Articles, letters, review and proceedings papers

Query data: 12 May, 2019

Install and load bibliometrix R-package

# Stable version from CRAN (Comprehensive R Archive Network)
# if you need to execute the code, remove # from the beginning of the next line
# install.packages("bibliometrix")
# Most updated version from GitHub
# if you need to execute the code, remove # from the beginning of the next lines
# install.packages("devtools")
# devtools::install_github("massimoaria/bibliometrix")
library(bibliometrix)
package ‘bibliometrix’ was built under R version 3.5.2To cite bibliometrix in publications, please use:

Aria, M. & Cuccurullo, C. (2017) bibliometrix: An R-tool for comprehensive science mapping analysis, Journal of Informetrics, 11(4), pp 959-975, Elsevier.
                        

http:\\www.bibliometrix.org

                        
To start with the shiny web-interface, please digit:
biblioshiny()

Data Loading and Converting

true_carps <- read.csv("../data/carp_yes_no.csv") %>% filter(CARP..Yes.No. == 1) %>% select(X)
true_carps <- read.csv("../data/carp_yes_no.csv") %>% filter(CARP..Yes.No. == 1) %>% select(X)
D <- readFiles("../data/arp_grp_2010_2019_references.bib")
# Converting the loaded files into a R bibliographic dataframe
M <- convert2df(D, dbsource="isi",format="bibtex")

Converting your isi collection into a bibliographic dataframe

Section 1: Descriptive Analysis

Although bibliometrics is mainly known for quantifying the scientific production and measuring its quality and impact, it is also useful for displaying and analysing the intellectual, conceptual and social structures of research as well as their evolution and dynamical aspects.

In this way, bibliometrics aims to describe how specific disciplines, scientific domains, or research fields are structured and how they evolve over time. In other words, bibliometric methods help to map the science (so-called science mapping) and are very useful in the case of research synthesis, especially for the systematic ones.

Bibliometrics is an academic science founded on a set of statistical methods, which can be used to analyze scientific big data quantitatively and their evolution over time and discover information. Network structure is often used to model the interaction among authors, papers/documents/articles, references, keywords, etc.

Bibliometrix is an open-source software for automating the stages of data-analysis and data-visualization. After converting and uploading bibliographic data in R, Bibliometrix performs a descriptive analysis and different research-structure analysis.

Descriptive analysis provides some snapshots about the annual research development, the top “k” productive authors, papers, countries and most relevant keywords.

Main findings about the collection

#options(width=160)
results <- biblioAnalysis(M)
summary(results, k=10, pause=F, width=130)


Main Information about data

 Documents                             158 
 Sources (Journals, Books, etc.)       74 
 Keywords Plus (ID)                    189 
 Author's Keywords (DE)                339 
 Period                                2010 - 2019 
 Average citations per documents       9.032 

 Authors                               289 
 Author Appearances                    512 
 Authors of single-authored documents  8 
 Authors of multi-authored documents   281 
 Single-authored documents             8 

 Documents per Author                  0.547 
 Authors per Document                  1.83 
 Co-Authors per Documents              3.24 
 Collaboration Index                   1.87 
 
 Document types                     
 ARTICLE                         109 
 ARTICLE, BOOK CHAPTER           7 
 ARTICLE, DATA PAPER             1 
 ARTICLE, PROCEEDINGS PAPER      6 
 PROCEEDINGS PAPER               35 
 

Annual Scientific Production

Annual Percentage Growth Rate -9.163666 


Most Productive Authors


Top manuscripts per citations


Corresponding Author's Countries


SCP: Single Country Publications

MCP: Multiple Country Publications


Total Citations per Country


Most Relevant Sources


Most Relevant Keywords
plot(x=results, k=10, pause=F)

Most Cited References

CR <- citations(M, field = "article", sep = ";")
cbind(CR$Cited[1:20])
                                                                                   [,1]
GOLDEN BL, 1981, NETWORKS, V11, P305, DOI 10.1002/NET.3230110308.                   102
GOLDEN BL, 1983, COMPUT OPER RES, V10, P47, DOI 10.1016/0305-0548(83)90026-6.        68
LACOMME P, 2004, ANN OPER RES, V131, P159, DOI 10.1023/B:ANOR.0000039517.35989.6D.   66
BEULLENS P, 2003, EUR J OPER RES, V147, P629, DOI 10.1016/S0377-2217(02)00334-X.     62
BRANDAO J, 2008, COMPUT OPER RES, V35, P1112, DOI 10.1016/J.COR.2006.07.007.         62
BENAVENT E, 1992, NETWORKS, V22, P669, DOI 10.1002/NET.3230220706.                   55
HERTZ A, 2000, OPER RES, V48, P129, DOI 10.1287/OPRE.48.1.129.12455.                 53
BELENGUER JM, 2003, COMPUT OPER RES, V30, P705, DOI 10.1016/S0305-0548(02)00046-1.   49
ULUSOY G, 1985, EUR J OPER RES, V22, P329, DOI 10.1016/0377-2217(85)90252-8.         48
TANG K, 2009, IEEE T EVOLUT COMPUT, V13, P1151, DOI 10.1109/TEVC.2009.2023449.       47
LONGO H, 2006, COMPUT OPER RES, V33, P1823, DOI 10.1016/J.COR.2004.11.020.           46
DROR M., 2000, ARC ROUTING THEORY S.                                                 43
EGLESE RW, 1994, DISCRETE APPL MATH, V48, P231, DOI 10.1016/0166-218X(92)00003-5.    42
BELENGUER JM, 2006, COMPUT OPER RES, V33, P3363, DOI 10.1016/J.COR.2005.02.009.      37
POLACEK M, 2008, J HEURISTICS, V14, P405, DOI 10.1007/S10732-007-9050-2.             36
HERTZ A, 2001, TRANSPORT SCI, V35, P425, DOI 10.1287/TRSC.35.4.425.10431.            35
LI LYO, 1996, J OPER RES SOC, V47, P217, DOI 10.1057/JORS.1996.20.                   35
BALDACCI R, 2006, NETWORKS, V47, P52, DOI [10.1002/NET.20091, 10.1002/NET.20091].    32
CORBERAN A, 2010, NETWORKS, V56, P50, DOI 10.1002/NET.20347.                         31
WOHLK S, 2008, OPER RES COMPUT SCI, V43, P29, DOI 10.1007/978-0-387-77778-8\\_2.     30

Section 2: The Intellectual Structure of the field - Co-citation Analysis

Citation analysis is one of the main classic techniques in bibliometrics. It shows the structure of a specific field through the linkages between nodes (e.g. authors, papers, journal), while the edges can be differently interpretated depending on the network type, that are namely co-citation, direct citation, bibliographic coupling. Please see Aria, Cuccurullo (2017).

Below there are three examples.

First, a co-citation network that shows relations between cited-reference works (nodes).

Second, a co-citation network that uses cited-journals as unit of analysis.

The useful dimensions to comment the co-citation networks are: (i) centrality and peripherality of nodes, (ii) their proximity and distance, (iii) strength of ties, (iv) clusters, (iiv) bridging contributions.

Third, a historiograph is built on direct citations. It draws the intellectual linkages in a historical order. Cited works of thousands of authors contained in a collection of published scientific articles is sufficient for recostructing the historiographic structure of the field, calling out the basic works in it.

Article (References) co-citation analysis

Plot options:

  • n = 50 (the funxtion plots the main 50 cited references)

  • type = “fruchterman” (the network layout is generated using the Fruchterman-Reingold Algorithm)

  • size.cex = TRUE (the size of the vertices is proportional to their degree)

  • size = 20 (the max size of vertices)

  • remove.multiple=FALSE (multiple edges are not removed)

  • labelsize = 0.7 (defines the size of vertex labels)

  • edgesize = 10 (The thickness of the edges is proportional to their strength. Edgesize defines the max value of the thickness)

  • edges.min = 5 (plots only edges with a strength greater than or equal to 5)

  • all other arguments assume the default values

NetMatrix <- biblioNetwork(M, analysis = "co-citation", network = "references", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Citation Network", type = "fruchterman", size.cex=TRUE, size=20, remove.multiple=FALSE, labelsize=0.7,edgesize = 10, edges.min=5)

Descriptive analysis of Article co-citation network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=10)


Main statistics about the network

 Size                                  2363 
 Density                               0.039 
 Transitivity                          0.395 
 Diameter                              4 
 Degree Centralization                 0.633 
 Average path length                   2.164 
 

Journal (Source) co-citation analysis

M=metaTagExtraction(M,"CR_SO",sep=";")
NetMatrix <- biblioNetwork(M, analysis = "co-citation", network = "sources", sep = ";")
net=networkPlot(NetMatrix, n = 50, Title = "Co-Citation Network", type = "auto", size.cex=TRUE, size=15, remove.multiple=FALSE, labelsize=0.7,edgesize = 10, edges.min=5)

Descriptive analysis of Journal co-citation network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=10)


Main statistics about the network

 Size                                  1028 
 Density                               0.054 
 Transitivity                          0.253 
 Diameter                              3 
 Degree Centralization                 0.879 
 Average path length                   1.958 
 

Section 3: Historiograph - Direct citation linkages

histResults <- histNetwork(M, min.citations=quantile(M$TC,0.75), sep = ";")
Articles analysed   44 
options(width = 100)
net <- histPlot(histResults, n=20, size.cex=TRUE, size = 5, labelsize = 3, arrowsize = 0.5)

 Legend

Section 4: The conceptual structure - Co-Word Analysis

Co-word networks show the conceptual structure, that uncovers links between concepts through term co-occurences.

Conceptual structure is often used to understand the topics covered by scholars (so-called research front) and identify what are the most important and the most recent issues.

Dividing the whole timespan in different timeslices and comparing the conceptual structures is useful to analyze the evolution of topics over time.

Bibliometrix is able to analyze keywords, but also the terms in the articles’ titles and abstracts. It does it using network analysis or correspondance analysis (CA) or multiple correspondance analysis (MCA). CA and MCA visualise the conceptual structure in a two-dimensional plot.

Co-word Analysis through Keyword co-occurrences

Plot options:

  • normalize = “association” (the vertex similarities are normalized using association strength)

  • n = 50 (the function plots the main 50 cited references)

  • type = “fruchterman” (the network layout is generated using the Fruchterman-Reingold Algorithm)

  • size.cex = TRUE (the size of the vertices is proportional to their degree)

  • size = 20 (the max size of the vertices)

  • remove.multiple=FALSE (multiple edges are not removed)

  • labelsize = 3 (defines the max size of vertex labels)

  • label.cex = TRUE (The vertex label sizes are proportional to their degree)

  • edgesize = 10 (The thickness of the edges is proportional to their strength. Edgesize defines the max value of the thickness)

  • label.n = 30 (Labels are plotted only for the main 30 vertices)

  • edges.min = 25 (plots only edges with a strength greater than or equal to 2)

  • all other arguments assume the default values

NetMatrix <- biblioNetwork(M, analysis = "co-occurrences", network = "keywords", sep = ";")
net=networkPlot(NetMatrix, normalize="association", n = 50, Title = "Keyword Co-occurrences", type = "fruchterman", size.cex=TRUE, size=20, remove.multiple=F, edgesize = 10, labelsize=3,label.cex=TRUE,label.n=30,edges.min=2)

Descriptive analysis of keyword co-occurrences network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=10)


Main statistics about the network

 Size                                  191 
 Density                               0.057 
 Transitivity                          0.359 
 Diameter                              6 
 Degree Centralization                 0.233 
 Average path length                   2.564 
 

Co-word Analysis through Correspondence Analysis

CS <- conceptualStructure(M, method="CA", field="ID", minDegree=10, k.max = 8, stemming=f, labelsize=8,documents=20)

Section 5: Thematic Map

Co-word analysis draws clusters of keywords. They are considered as themes, whose density and centrality can be used in classifying themes and mapping in a two-dimensional diagram.

Thematic map is a very intuitive plot and we can analyze themes according to the quadrant in which they are placed: (1) upper-right quadrant: motor-themes; (2) lower-right quadrant: basic themes; (3) lower-left quadrant: emerging or disappearing themes; (4) upper-left quadrant: very specialized/niche themes.

Please see Cobo, M. J., L?pez-Herrera, A. G., Herrera-Viedma, E., & Herrera, F. (2011). An approach for detecting, quantifying, and visualizing the evolution of a research field: A practical application to the fuzzy sets theory field. Journal of Informetrics, 5(1), 146-166.

Map=thematicMap(M, field = "ID", n = 250, minfreq = 5,
  stemming = FALSE, size = 0.5, repel = TRUE)
plot(Map$map)

Cluster description

Clusters=Map$words[order(Map$words$Cluster,-Map$words$Occurrences),]
library(dplyr)
CL <- Clusters %>% group_by(.data$Cluster_Label) %>% top_n(5, .data$Occurrences)
CL

Section 6: The social structure - Collaboration Analysis

Collaboration networks show how authors, institutions (e.g. universities or departments) and countries relate to others in a specific field of research. For example, the first figure below is a co-author network. It discovers regular study groups, hidden groups of scholars, and pivotal authors. The second figure is called “Edu collaboration network” and uncovers relevant institutions in a specific research field and their relations.

Author collaboration network

NetMatrix <- biblioNetwork(M, analysis = "collaboration",  network = "authors", sep = ";")
net=networkPlot(NetMatrix,  n = 50, Title = "Author collaboration",type = "auto", size=10,size.cex=T,edgesize = 3,labelsize=0.6)

Descriptive analysis of author collaboration network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=15)


Main statistics about the network

 Size                                  289 
 Density                               0.013 
 Transitivity                          0.568 
 Diameter                              7 
 Degree Centralization                 0.05 
 Average path length                   2.965 
 

Edu collaboration network

NetMatrix <- biblioNetwork(M, analysis = "collaboration",  network = "universities", sep = ";")
net=networkPlot(NetMatrix,  n = 50, Title = "Edu collaboration",type = "auto", size=10,size.cex=T,edgesize = 3,labelsize=0.6)

Descriptive analysis of edu collaboration network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=15)


Main statistics about the network

 Size                                  157 
 Density                               0.013 
 Transitivity                          0.439 
 Diameter                              7 
 Degree Centralization                 0.064 
 Average path length                   2.944 
 

Country collaboration network

M <- metaTagExtraction(M, Field = "AU_CO", sep = ";")
NetMatrix <- biblioNetwork(M, analysis = "collaboration",  network = "countries", sep = ";")
net=networkPlot(NetMatrix,  n = dim(NetMatrix)[1], Title = "Country collaboration",type = "sphere", size=10,size.cex=T,edgesize = 1,labelsize=0.6, cluster="none")

Descriptive analysis of country collaboration network characteristics

netstat <- networkStat(NetMatrix)
summary(netstat,k=15)


Main statistics about the network

 Size                                  37 
 Density                               0.071 
 Transitivity                          0.274 
 Diameter                              4 
 Degree Centralization                 0.291 
 Average path length                   2.396 
 
LS0tCnRpdGxlOiAiU2NpZW5jZSBNYXBwaW5nIEFuYWx5c2lzIHdpdGggYmlibGlvbWV0cml4IFItcGFja2FnZTogQ0FSUCBhbmQgR1JQIgphdXRob3I6IEVsaWFzIEouIFdpbGxlbXNlCmRhdGU6IE1heSAxMiwgMjAxOQpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICBwcmV0dHlkb2M6Omh0bWxfcHJldHR5OgogICAgdGhlbWU6IGhwc3RyCiAgICBoaWdobGlnaHQ6IGdpdGh1YgotLS0KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMgSW5zdGFsbGF0aW9uIG9mIHNvbWUgdXNlZnVsIHBhY2thZ2VzCmlmKCFpc1RSVUUocmVxdWlyZSgicHJldHR5ZG9jIikpKXtpbnN0YWxsLnBhY2thZ2VzKCJwcmV0dHlkb2MiKX0KaWYoIWlzVFJVRShyZXF1aXJlKCJyaW8iKSkpe2luc3RhbGwucGFja2FnZXMoInJpbyIpfQpsaWJyYXJ5KHByZXR0eWRvYykKbGlicmFyeShyaW8pCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCgojIEJpYmxpb2dyYXBoaWMgQ29sbGVjdGlvbgoKKipEYXRhIHNvdXJjZSoqOiAgIENsYXJpdmF0ZSBBbmFseXRpY3MgV2ViIG9mIFNjaWVuY2UgKGh0dHA6Ly9hcHBzLndlYm9ma25vd2xlZGdlLmNvbSkKCioqRGF0YSBmb3JtYXQqKjogICBQbGFpbnRleHQKCioqUXVlcnkqKjogICAgICAgICBUTyA9ICJDYXBhY2l0YXRlZCBBcmMgUm91dGluZyIgT1IgIkNhcGFjaXRhdGVkIEdlbmVyYWwgUm91dGluZyIKCioqVGltZXNwYW4qKjogICAgICAyMDEwLTIwMTkKCioqRG9jdW1lbnQgVHlwZSoqOiBBcnRpY2xlcywgbGV0dGVycywgcmV2aWV3IGFuZCBwcm9jZWVkaW5ncyBwYXBlcnMKCioqUXVlcnkgZGF0YSoqOiAgICAxMiBNYXksIDIwMTkKCgojIEluc3RhbGwgYW5kIGxvYWQgYmlibGlvbWV0cml4IFItcGFja2FnZQpgYGB7ciBsb2FkIGJpYmxpb21ldHJpeH0KIyBTdGFibGUgdmVyc2lvbiBmcm9tIENSQU4gKENvbXByZWhlbnNpdmUgUiBBcmNoaXZlIE5ldHdvcmspCiMgaWYgeW91IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29kZSwgcmVtb3ZlICMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUKCiMgaW5zdGFsbC5wYWNrYWdlcygiYmlibGlvbWV0cml4IikKCgojIE1vc3QgdXBkYXRlZCB2ZXJzaW9uIGZyb20gR2l0SHViCiMgaWYgeW91IG5lZWQgdG8gZXhlY3V0ZSB0aGUgY29kZSwgcmVtb3ZlICMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmVzCgojIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIm1hc3NpbW9hcmlhL2JpYmxpb21ldHJpeCIpCgpsaWJyYXJ5KGJpYmxpb21ldHJpeCkKYGBgCgoKIyBEYXRhIExvYWRpbmcgYW5kIENvbnZlcnRpbmcKYGBge3IgRGF0YSBsb2FkaW5nLCB3YXJuaW5nPUZBTFNFfQojIExvYWRpbmcgdHh0IG9yIGJpYiBmaWxlcyBpbnRvIFIgZW52aXJvbm1lbnQKRCA8LSByZWFkRmlsZXMoIi4uL2RhdGEvYXJwX2dycF8yMDEwXzIwMTlfcmVmZXJlbmNlcy5iaWIiKQoKIyBDb252ZXJ0aW5nIHRoZSBsb2FkZWQgZmlsZXMgaW50byBhIFIgYmlibGlvZ3JhcGhpYyBkYXRhZnJhbWUKTSA8LSBjb252ZXJ0MmRmKEQsIGRic291cmNlPSJpc2kiLGZvcm1hdD0iYmlidGV4IikKTSA8LSBNICU+JSBmaWx0ZXIoUFkgPj0gMjAxMCkKdHJ1ZV9jYXJwcyA8LSByZWFkLmNzdigiLi4vZGF0YS9jYXJwX3llc19uby5jc3YiKSAlPiUgZmlsdGVyKENBUlAuLlllcy5Oby4gPT0gMSkgJT4lIHNlbGVjdChYKQoKTV9yZWQgPC0gTSAlPiUgc2VtaV9qb2luKHNlbGVjdCh0cnVlX2NhcnBzKSkKI00yIDwtIE0KI00yCiN3cml0ZS5jc3YoTTIsICcuLi9kYXRhL2FycF9ncnBfMjAxMF8yMDE5X3JlZmVyZW5jZXMuY3N2JykKYGBgCgpgYGB7cn0KCmBgYAoKIyBTZWN0aW9uIDE6IERlc2NyaXB0aXZlIEFuYWx5c2lzCgpBbHRob3VnaCBiaWJsaW9tZXRyaWNzIGlzIG1haW5seSBrbm93biBmb3IgcXVhbnRpZnlpbmcgdGhlIHNjaWVudGlmaWMgcHJvZHVjdGlvbiBhbmQgbWVhc3VyaW5nIGl0cyBxdWFsaXR5IGFuZCBpbXBhY3QsIGl0IGlzIGFsc28gdXNlZnVsIGZvciBkaXNwbGF5aW5nIGFuZCBhbmFseXNpbmcgdGhlIGludGVsbGVjdHVhbCwgY29uY2VwdHVhbCBhbmQgc29jaWFsIHN0cnVjdHVyZXMgb2YgcmVzZWFyY2ggYXMgd2VsbCBhcyB0aGVpciBldm9sdXRpb24gYW5kIGR5bmFtaWNhbCBhc3BlY3RzLiAKCkluIHRoaXMgd2F5LCBiaWJsaW9tZXRyaWNzIGFpbXMgdG8gZGVzY3JpYmUgaG93IHNwZWNpZmljIGRpc2NpcGxpbmVzLCBzY2llbnRpZmljIGRvbWFpbnMsIG9yIHJlc2VhcmNoIGZpZWxkcyBhcmUgc3RydWN0dXJlZCBhbmQgaG93IHRoZXkgZXZvbHZlIG92ZXIgdGltZS4gSW4gb3RoZXIgd29yZHMsIGJpYmxpb21ldHJpYyBtZXRob2RzIGhlbHAgdG8gbWFwIHRoZSBzY2llbmNlIChzby1jYWxsZWQgc2NpZW5jZSBtYXBwaW5nKSBhbmQgYXJlIHZlcnkgdXNlZnVsIGluIHRoZSBjYXNlIG9mIHJlc2VhcmNoIHN5bnRoZXNpcywgZXNwZWNpYWxseSBmb3IgdGhlIHN5c3RlbWF0aWMgb25lcy4KCkJpYmxpb21ldHJpY3MgaXMgYW4gYWNhZGVtaWMgc2NpZW5jZSBmb3VuZGVkIG9uIGEgc2V0IG9mIHN0YXRpc3RpY2FsIG1ldGhvZHMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgc2NpZW50aWZpYyBiaWcgZGF0YSBxdWFudGl0YXRpdmVseSBhbmQgdGhlaXIgZXZvbHV0aW9uIG92ZXIgdGltZSBhbmQgZGlzY292ZXIgaW5mb3JtYXRpb24uIE5ldHdvcmsgc3RydWN0dXJlIGlzIG9mdGVuIHVzZWQgdG8gbW9kZWwgdGhlIGludGVyYWN0aW9uIGFtb25nIGF1dGhvcnMsIHBhcGVycy9kb2N1bWVudHMvYXJ0aWNsZXMsIHJlZmVyZW5jZXMsIGtleXdvcmRzLCBldGMuCgpCaWJsaW9tZXRyaXggaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgZm9yIGF1dG9tYXRpbmcgdGhlIHN0YWdlcyBvZiBkYXRhLWFuYWx5c2lzIGFuZCBkYXRhLXZpc3VhbGl6YXRpb24uIEFmdGVyIGNvbnZlcnRpbmcgYW5kIHVwbG9hZGluZyBiaWJsaW9ncmFwaGljIGRhdGEgaW4gUiwgQmlibGlvbWV0cml4IHBlcmZvcm1zIGEgZGVzY3JpcHRpdmUgYW5hbHlzaXMgYW5kIGRpZmZlcmVudCByZXNlYXJjaC1zdHJ1Y3R1cmUgYW5hbHlzaXMuCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBwcm92aWRlcyBzb21lIHNuYXBzaG90cyBhYm91dCB0aGUgYW5udWFsIHJlc2VhcmNoIGRldmVsb3BtZW50LCB0aGUgdG9wICJrIiBwcm9kdWN0aXZlIGF1dGhvcnMsIHBhcGVycywgY291bnRyaWVzIGFuZCBtb3N0IHJlbGV2YW50IGtleXdvcmRzLgoKCgojIyBNYWluIGZpbmRpbmdzIGFib3V0IHRoZSBjb2xsZWN0aW9uCgpgYGB7ciBEZXNjcmlwdGl2ZSBBbmFseXNpcywgZWNobz1UUlVFLCBjb21tZW50PU5BfQojb3B0aW9ucyh3aWR0aD0xNjApCnJlc3VsdHMgPC0gYmlibGlvQW5hbHlzaXMoTSkKc3VtbWFyeShyZXN1bHRzLCBrPTEwLCBwYXVzZT1GLCB3aWR0aD0xMzApCnBsb3QoeD1yZXN1bHRzLCBrPTEwLCBwYXVzZT1GKQpgYGAKCiMjIE1vc3QgQ2l0ZWQgUmVmZXJlbmNlcwoKYGBge3IgTW9zdCBjaXRlZCByZWZlcmVuY2VzLCAgY29tbWVudD1OQX0KQ1IgPC0gY2l0YXRpb25zKE0sIGZpZWxkID0gImFydGljbGUiLCBzZXAgPSAiOyIpCmNiaW5kKENSJENpdGVkWzE6MjBdKQpgYGAKCgojIFNlY3Rpb24gMjogVGhlIEludGVsbGVjdHVhbCBTdHJ1Y3R1cmUgb2YgdGhlIGZpZWxkIC0gQ28tY2l0YXRpb24gQW5hbHlzaXMKCkNpdGF0aW9uIGFuYWx5c2lzIGlzIG9uZSBvZiB0aGUgbWFpbiBjbGFzc2ljIHRlY2huaXF1ZXMgaW4gYmlibGlvbWV0cmljcy4gSXQgc2hvd3MgdGhlIHN0cnVjdHVyZSBvZiBhIHNwZWNpZmljIGZpZWxkIHRocm91Z2ggdGhlIGxpbmthZ2VzIGJldHdlZW4gbm9kZXMgKGUuZy4gYXV0aG9ycywgcGFwZXJzLCBqb3VybmFsKSwgd2hpbGUgdGhlIGVkZ2VzIGNhbiBiZSBkaWZmZXJlbnRseSBpbnRlcnByZXRhdGVkIGRlcGVuZGluZyBvbiB0aGUgbmV0d29yayB0eXBlLCB0aGF0IGFyZSBuYW1lbHkgY28tY2l0YXRpb24sIGRpcmVjdCBjaXRhdGlvbiwgYmlibGlvZ3JhcGhpYyBjb3VwbGluZy4gUGxlYXNlIHNlZSBBcmlhLCBDdWNjdXJ1bGxvICgyMDE3KS4KCkJlbG93IHRoZXJlIGFyZSB0aHJlZSBleGFtcGxlcy4KCkZpcnN0LCBhIGNvLWNpdGF0aW9uIG5ldHdvcmsgdGhhdCBzaG93cyByZWxhdGlvbnMgYmV0d2VlbiBjaXRlZC1yZWZlcmVuY2Ugd29ya3MgKG5vZGVzKS4KClNlY29uZCwgYSBjby1jaXRhdGlvbiBuZXR3b3JrIHRoYXQgdXNlcyBjaXRlZC1qb3VybmFscyBhcyB1bml0IG9mIGFuYWx5c2lzLgoKVGhlIHVzZWZ1bCBkaW1lbnNpb25zIHRvIGNvbW1lbnQgdGhlIGNvLWNpdGF0aW9uIG5ldHdvcmtzIGFyZTogKGkpIGNlbnRyYWxpdHkgYW5kIHBlcmlwaGVyYWxpdHkgb2Ygbm9kZXMsIChpaSkgdGhlaXIgcHJveGltaXR5IGFuZCBkaXN0YW5jZSwgKGlpaSkgc3RyZW5ndGggb2YgdGllcywgKGl2KSBjbHVzdGVycywgKGlpdikgYnJpZGdpbmcgY29udHJpYnV0aW9ucy4KClRoaXJkLCBhIGhpc3RvcmlvZ3JhcGggaXMgYnVpbHQgb24gZGlyZWN0IGNpdGF0aW9ucy4gSXQgZHJhd3MgdGhlIGludGVsbGVjdHVhbCBsaW5rYWdlcyBpbiBhIGhpc3RvcmljYWwgb3JkZXIuIENpdGVkIHdvcmtzIG9mCnRob3VzYW5kcyBvZiBhdXRob3JzIGNvbnRhaW5lZCBpbiBhIGNvbGxlY3Rpb24gb2YgcHVibGlzaGVkIHNjaWVudGlmaWMgYXJ0aWNsZXMgaXMgc3VmZmljaWVudCBmb3IgcmVjb3N0cnVjdGluZyB0aGUgaGlzdG9yaW9ncmFwaGljIHN0cnVjdHVyZSBvZiB0aGUgZmllbGQsIGNhbGxpbmcgb3V0IHRoZSBiYXNpYyB3b3JrcyBpbiBpdC4KCgojIyBBcnRpY2xlIChSZWZlcmVuY2VzKSBjby1jaXRhdGlvbiBhbmFseXNpcwoqKlBsb3Qgb3B0aW9ucyoqOgoKKiBuID0gNTAgKHRoZSBmdW54dGlvbiBwbG90cyB0aGUgbWFpbiA1MCBjaXRlZCByZWZlcmVuY2VzKQoKKiB0eXBlID0gImZydWNodGVybWFuIiAodGhlIG5ldHdvcmsgbGF5b3V0IGlzIGdlbmVyYXRlZCB1c2luZyB0aGUgRnJ1Y2h0ZXJtYW4tUmVpbmdvbGQgQWxnb3JpdGhtKQoKKiBzaXplLmNleCA9IFRSVUUgKHRoZSBzaXplIG9mIHRoZSB2ZXJ0aWNlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgZGVncmVlKQoKKiBzaXplID0gMjAgKHRoZSBtYXggc2l6ZSBvZiB2ZXJ0aWNlcykKCiogcmVtb3ZlLm11bHRpcGxlPUZBTFNFIChtdWx0aXBsZSBlZGdlcyBhcmUgbm90IHJlbW92ZWQpCgoqIGxhYmVsc2l6ZSA9IDAuNyAoZGVmaW5lcyB0aGUgc2l6ZSBvZiB2ZXJ0ZXggbGFiZWxzKQoKKiBlZGdlc2l6ZSA9IDEwIChUaGUgdGhpY2tuZXNzIG9mIHRoZSBlZGdlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgc3RyZW5ndGguIEVkZ2VzaXplIGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgdGhpY2tuZXNzKQoKKiBlZGdlcy5taW4gPSA1IChwbG90cyBvbmx5IGVkZ2VzIHdpdGggYSBzdHJlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNSkKCiogYWxsIG90aGVyIGFyZ3VtZW50cyBhc3N1bWUgdGhlIGRlZmF1bHQgdmFsdWVzCgpgYGB7ciBDby1jaXRhdGlvbiBuZXR3b3JrLCBjb21tZW50PU5BLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9Ck5ldE1hdHJpeCA8LSBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNvLWNpdGF0aW9uIiwgbmV0d29yayA9ICJyZWZlcmVuY2VzIiwgc2VwID0gIjsiKQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBuID0gNTAsIFRpdGxlID0gIkNpdGF0aW9uIE5ldHdvcmsiLCB0eXBlID0gImZydWNodGVybWFuIiwgc2l6ZS5jZXg9VFJVRSwgc2l6ZT0yMCwgcmVtb3ZlLm11bHRpcGxlPUZBTFNFLCBsYWJlbHNpemU9MC43LGVkZ2VzaXplID0gMTAsIGVkZ2VzLm1pbj01KQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIEFydGljbGUgY28tY2l0YXRpb24gbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKYGBge3IgQ28tY2l0YXRpb24gbmV0IHN0YXQsIGNvbW1lbnQ9TkF9Cm5ldHN0YXQgPC0gbmV0d29ya1N0YXQoTmV0TWF0cml4KQpzdW1tYXJ5KG5ldHN0YXQsaz0xMCkKYGBgCgoKIyMgSm91cm5hbCAoU291cmNlKSBjby1jaXRhdGlvbiBhbmFseXNpcwoKYGBge3IgQ28tY2l0YXRpb24gc291cmNlIG5ldHdvcmssIGNvbW1lbnQ9TkEsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTT1tZXRhVGFnRXh0cmFjdGlvbihNLCJDUl9TTyIsc2VwPSI7IikKTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY28tY2l0YXRpb24iLCBuZXR3b3JrID0gInNvdXJjZXMiLCBzZXAgPSAiOyIpCm5ldD1uZXR3b3JrUGxvdChOZXRNYXRyaXgsIG4gPSA1MCwgVGl0bGUgPSAiQ28tQ2l0YXRpb24gTmV0d29yayIsIHR5cGUgPSAiYXV0byIsIHNpemUuY2V4PVRSVUUsIHNpemU9MTUsIHJlbW92ZS5tdWx0aXBsZT1GQUxTRSwgbGFiZWxzaXplPTAuNyxlZGdlc2l6ZSA9IDEwLCBlZGdlcy5taW49NSkKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBKb3VybmFsIGNvLWNpdGF0aW9uIG5ldHdvcmsgY2hhcmFjdGVyaXN0aWNzCmBgYHtyIFNvIENvLWNpdGF0aW9uIG5ldCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTApCmBgYAoKCiMgU2VjdGlvbiAzOiBIaXN0b3Jpb2dyYXBoIC0gRGlyZWN0IGNpdGF0aW9uIGxpbmthZ2VzCgoKYGBge3IgRGlyZWN0IGNpdGF0aW9uIG5ldHdvcmssIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KaGlzdFJlc3VsdHMgPC0gaGlzdE5ldHdvcmsoTSwgbWluLmNpdGF0aW9ucz1xdWFudGlsZShNJFRDLDAuNzUpLCBzZXAgPSAiOyIpCmBgYAoKYGBge3IgSGlzdG9yaW9ncmFwaCwgY29tbWVudD1OQSwgZmlnLmhlaWdodD03LGZpZy53aWR0aD0xMH0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKbmV0IDwtIGhpc3RQbG90KGhpc3RSZXN1bHRzLCBuPTIwLCBzaXplLmNleD1UUlVFLCBzaXplID0gNSwgbGFiZWxzaXplID0gMywgYXJyb3dzaXplID0gMC41KQpgYGAKCgojIFNlY3Rpb24gNDogVGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlIC0gQ28tV29yZCBBbmFseXNpcwoKQ28td29yZCBuZXR3b3JrcyBzaG93IHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSwgdGhhdCB1bmNvdmVycyBsaW5rcyBiZXR3ZWVuIGNvbmNlcHRzIHRocm91Z2ggdGVybSBjby1vY2N1cmVuY2VzLgoKQ29uY2VwdHVhbCBzdHJ1Y3R1cmUgaXMgb2Z0ZW4gdXNlZCB0byB1bmRlcnN0YW5kIHRoZSB0b3BpY3MgY292ZXJlZCBieSBzY2hvbGFycyAoc28tY2FsbGVkIHJlc2VhcmNoIGZyb250KSBhbmQgaWRlbnRpZnkgd2hhdCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCB0aGUgbW9zdCByZWNlbnQgaXNzdWVzLgoKRGl2aWRpbmcgdGhlIHdob2xlIHRpbWVzcGFuIGluIGRpZmZlcmVudCB0aW1lc2xpY2VzIGFuZCBjb21wYXJpbmcgdGhlIGNvbmNlcHR1YWwgc3RydWN0dXJlcyBpcyB1c2VmdWwgdG8gYW5hbHl6ZSB0aGUgZXZvbHV0aW9uIG9mIHRvcGljcyBvdmVyIHRpbWUuCgpCaWJsaW9tZXRyaXggaXMgYWJsZSB0byBhbmFseXplIGtleXdvcmRzLCBidXQgYWxzbyB0aGUgdGVybXMgaW4gdGhlIGFydGljbGVzJyB0aXRsZXMgYW5kIGFic3RyYWN0cy4gSXQgZG9lcyBpdCB1c2luZyBuZXR3b3JrIGFuYWx5c2lzIG9yIGNvcnJlc3BvbmRhbmNlIGFuYWx5c2lzIChDQSkgb3IgbXVsdGlwbGUgY29ycmVzcG9uZGFuY2UgYW5hbHlzaXMgKE1DQSkuIENBIGFuZCBNQ0EgdmlzdWFsaXNlIHRoZSBjb25jZXB0dWFsIHN0cnVjdHVyZSBpbiBhIHR3by1kaW1lbnNpb25hbCBwbG90LgogCgojIyBDby13b3JkIEFuYWx5c2lzIHRocm91Z2ggS2V5d29yZCBjby1vY2N1cnJlbmNlcwoKKipQbG90IG9wdGlvbnMqKjoKCiogbm9ybWFsaXplID0gImFzc29jaWF0aW9uIiAodGhlIHZlcnRleCBzaW1pbGFyaXRpZXMgYXJlIG5vcm1hbGl6ZWQgdXNpbmcgYXNzb2NpYXRpb24gc3RyZW5ndGgpCgoqIG4gPSA1MCAodGhlIGZ1bmN0aW9uIHBsb3RzIHRoZSBtYWluIDUwIGNpdGVkIHJlZmVyZW5jZXMpCgoqIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iICh0aGUgbmV0d29yayBsYXlvdXQgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBGcnVjaHRlcm1hbi1SZWluZ29sZCBBbGdvcml0aG0pCgoqIHNpemUuY2V4ID0gVFJVRSAodGhlIHNpemUgb2YgdGhlIHZlcnRpY2VzIGlzIHByb3BvcnRpb25hbCB0byB0aGVpciBkZWdyZWUpCgoqIHNpemUgPSAyMCAodGhlIG1heCBzaXplIG9mIHRoZSB2ZXJ0aWNlcykgCgoqIHJlbW92ZS5tdWx0aXBsZT1GQUxTRSAobXVsdGlwbGUgZWRnZXMgYXJlIG5vdCByZW1vdmVkKQoKKiBsYWJlbHNpemUgPSAzIChkZWZpbmVzIHRoZSBtYXggc2l6ZSBvZiB2ZXJ0ZXggbGFiZWxzKQoKKiBsYWJlbC5jZXggPSBUUlVFIChUaGUgdmVydGV4IGxhYmVsIHNpemVzIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgZGVncmVlKQoKKiBlZGdlc2l6ZSA9IDEwIChUaGUgdGhpY2tuZXNzIG9mIHRoZSBlZGdlcyBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlaXIgc3RyZW5ndGguIEVkZ2VzaXplIGRlZmluZXMgdGhlIG1heCB2YWx1ZSBvZiB0aGUgdGhpY2tuZXNzKQoKKiBsYWJlbC5uID0gMzAgKExhYmVscyBhcmUgcGxvdHRlZCBvbmx5IGZvciB0aGUgbWFpbiAzMCB2ZXJ0aWNlcykKCiogZWRnZXMubWluID0gMjUgKHBsb3RzIG9ubHkgZWRnZXMgd2l0aCBhIHN0cmVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyKQoKKiBhbGwgb3RoZXIgYXJndW1lbnRzIGFzc3VtZSB0aGUgZGVmYXVsdCB2YWx1ZXMKCmBgYHtyIEtleXdvcmQgY28tb2NjdXJyZW5jZXMsIGNvbW1lbnQ9TkEsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY28tb2NjdXJyZW5jZXMiLCBuZXR3b3JrID0gImtleXdvcmRzIiwgc2VwID0gIjsiKQpuZXQ9bmV0d29ya1Bsb3QoTmV0TWF0cml4LCBub3JtYWxpemU9ImFzc29jaWF0aW9uIiwgbiA9IDUwLCBUaXRsZSA9ICJLZXl3b3JkIENvLW9jY3VycmVuY2VzIiwgdHlwZSA9ICJmcnVjaHRlcm1hbiIsIHNpemUuY2V4PVRSVUUsIHNpemU9MjAsIHJlbW92ZS5tdWx0aXBsZT1GLCBlZGdlc2l6ZSA9IDEwLCBsYWJlbHNpemU9MyxsYWJlbC5jZXg9VFJVRSxsYWJlbC5uPTMwLGVkZ2VzLm1pbj0yKQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIGtleXdvcmQgY28tb2NjdXJyZW5jZXMgbmV0d29yayBjaGFyYWN0ZXJpc3RpY3MKCmBgYHtyIEtleXdvcmQgbmV0IHN0YXQsIGNvbW1lbnQ9TkF9Cm5ldHN0YXQgPC0gbmV0d29ya1N0YXQoTmV0TWF0cml4KQpzdW1tYXJ5KG5ldHN0YXQsaz0xMCkKYGBgCgoKIyMgQ28td29yZCBBbmFseXNpcyB0aHJvdWdoIENvcnJlc3BvbmRlbmNlIEFuYWx5c2lzCgpgYGB7ciBDby13b3JkIEFuYWx5c2lzLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CkNTIDwtIGNvbmNlcHR1YWxTdHJ1Y3R1cmUoTSwgbWV0aG9kPSJDQSIsIGZpZWxkPSJJRCIsIG1pbkRlZ3JlZT0xMCwgay5tYXggPSA4LCBzdGVtbWluZz1mLCBsYWJlbHNpemU9OCxkb2N1bWVudHM9MjApCmBgYAoKCgojIFNlY3Rpb24gNTogVGhlbWF0aWMgTWFwCgpDby13b3JkIGFuYWx5c2lzIGRyYXdzIGNsdXN0ZXJzIG9mIGtleXdvcmRzLiBUaGV5IGFyZSBjb25zaWRlcmVkIGFzIHRoZW1lcywgd2hvc2UgZGVuc2l0eSBhbmQgY2VudHJhbGl0eSBjYW4gYmUgdXNlZCBpbiBjbGFzc2lmeWluZyB0aGVtZXMgYW5kIG1hcHBpbmcgaW4gYSB0d28tZGltZW5zaW9uYWwgZGlhZ3JhbS4KClRoZW1hdGljIG1hcCBpcyBhIHZlcnkgaW50dWl0aXZlIHBsb3QgYW5kIHdlIGNhbiBhbmFseXplIHRoZW1lcyBhY2NvcmRpbmcgdG8gdGhlIHF1YWRyYW50IGluIHdoaWNoIHRoZXkgYXJlIHBsYWNlZDogKDEpIHVwcGVyLXJpZ2h0IHF1YWRyYW50OiBtb3Rvci10aGVtZXM7ICgyKSBsb3dlci1yaWdodCBxdWFkcmFudDogYmFzaWMgdGhlbWVzOyAoMykgbG93ZXItbGVmdCBxdWFkcmFudDogZW1lcmdpbmcgb3IgZGlzYXBwZWFyaW5nIHRoZW1lczsgKDQpIHVwcGVyLWxlZnQgcXVhZHJhbnQ6IHZlcnkgc3BlY2lhbGl6ZWQvbmljaGUgdGhlbWVzLgoKUGxlYXNlIHNlZSBDb2JvLCBNLiBKLiwgTD9wZXotSGVycmVyYSwgQS4gRy4sIEhlcnJlcmEtVmllZG1hLCBFLiwgJiBIZXJyZXJhLCBGLiAoMjAxMSkuIEFuIGFwcHJvYWNoIGZvciBkZXRlY3RpbmcsIHF1YW50aWZ5aW5nLCBhbmQgdmlzdWFsaXppbmcgdGhlIGV2b2x1dGlvbiBvZiBhIHJlc2VhcmNoIGZpZWxkOiBBIHByYWN0aWNhbCBhcHBsaWNhdGlvbiB0byB0aGUgZnV6enkgc2V0cyB0aGVvcnkgZmllbGQuIEpvdXJuYWwgb2YgSW5mb3JtZXRyaWNzLCA1KDEpLCAxNDYtMTY2LgoKCgpgYGB7ciBUaGVtYXRpY01hcCwgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05fQoKTWFwPXRoZW1hdGljTWFwKE0sIGZpZWxkID0gIklEIiwgbiA9IDI1MCwgbWluZnJlcSA9IDUsCiAgc3RlbW1pbmcgPSBGQUxTRSwgc2l6ZSA9IDAuNSwgcmVwZWwgPSBUUlVFKQpwbG90KE1hcCRtYXApCmBgYAoKCkNsdXN0ZXIgZGVzY3JpcHRpb24KYGBge3J9CkNsdXN0ZXJzPU1hcCR3b3Jkc1tvcmRlcihNYXAkd29yZHMkQ2x1c3RlciwtTWFwJHdvcmRzJE9jY3VycmVuY2VzKSxdCmxpYnJhcnkoZHBseXIpCkNMIDwtIENsdXN0ZXJzICU+JSBncm91cF9ieSguZGF0YSRDbHVzdGVyX0xhYmVsKSAlPiUgdG9wX24oNSwgLmRhdGEkT2NjdXJyZW5jZXMpCkNMCmBgYAoKCiMgU2VjdGlvbiA2OiBUaGUgc29jaWFsIHN0cnVjdHVyZSAtIENvbGxhYm9yYXRpb24gQW5hbHlzaXMKCkNvbGxhYm9yYXRpb24gbmV0d29ya3Mgc2hvdyBob3cgYXV0aG9ycywgaW5zdGl0dXRpb25zIChlLmcuIHVuaXZlcnNpdGllcyBvciBkZXBhcnRtZW50cykgYW5kIGNvdW50cmllcyByZWxhdGUgdG8gb3RoZXJzIGluIGEgc3BlY2lmaWMgZmllbGQgb2YgcmVzZWFyY2guIEZvciBleGFtcGxlLCB0aGUgZmlyc3QgZmlndXJlIGJlbG93IGlzIGEgY28tYXV0aG9yIG5ldHdvcmsuIEl0IGRpc2NvdmVycyByZWd1bGFyIHN0dWR5IGdyb3VwcywgaGlkZGVuIGdyb3VwcyBvZiBzY2hvbGFycywgYW5kIHBpdm90YWwgYXV0aG9ycy4gVGhlIHNlY29uZCBmaWd1cmUgaXMgY2FsbGVkICJFZHUgY29sbGFib3JhdGlvbiBuZXR3b3JrIiBhbmQgdW5jb3ZlcnMgcmVsZXZhbnQgaW5zdGl0dXRpb25zIGluIGEgc3BlY2lmaWMgcmVzZWFyY2ggZmllbGQgYW5kIHRoZWlyIHJlbGF0aW9ucy4KCiMjIEF1dGhvciBjb2xsYWJvcmF0aW9uIG5ldHdvcmsKYGBge3IsIEF1IGNvbGxhYm9yYXRpb24gbmV0d29yaywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQpOZXRNYXRyaXggPC0gYmlibGlvTmV0d29yayhNLCBhbmFseXNpcyA9ICJjb2xsYWJvcmF0aW9uIiwgIG5ldHdvcmsgPSAiYXV0aG9ycyIsIHNlcCA9ICI7IikKbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgIG4gPSA1MCwgVGl0bGUgPSAiQXV0aG9yIGNvbGxhYm9yYXRpb24iLHR5cGUgPSAiYXV0byIsIHNpemU9MTAsc2l6ZS5jZXg9VCxlZGdlc2l6ZSA9IDMsbGFiZWxzaXplPTAuNikKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBhdXRob3IgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgQXUgY29sbCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTUpCmBgYAoKCiMjIEVkdSBjb2xsYWJvcmF0aW9uIG5ldHdvcmsKYGBge3IsIEVkdSBjb2xsYWJvcmF0aW9uIG5ldHdvcmssIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KTmV0TWF0cml4IDwtIGJpYmxpb05ldHdvcmsoTSwgYW5hbHlzaXMgPSAiY29sbGFib3JhdGlvbiIsICBuZXR3b3JrID0gInVuaXZlcnNpdGllcyIsIHNlcCA9ICI7IikKbmV0PW5ldHdvcmtQbG90KE5ldE1hdHJpeCwgIG4gPSA1MCwgVGl0bGUgPSAiRWR1IGNvbGxhYm9yYXRpb24iLHR5cGUgPSAiYXV0byIsIHNpemU9MTAsc2l6ZS5jZXg9VCxlZGdlc2l6ZSA9IDMsbGFiZWxzaXplPTAuNikKYGBgCgpEZXNjcmlwdGl2ZSBhbmFseXNpcyBvZiBlZHUgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgRWR1IGNvbGwgc3RhdCwgY29tbWVudD1OQX0KbmV0c3RhdCA8LSBuZXR3b3JrU3RhdChOZXRNYXRyaXgpCnN1bW1hcnkobmV0c3RhdCxrPTE1KQpgYGAKCgojIyBDb3VudHJ5IGNvbGxhYm9yYXRpb24gbmV0d29yawpgYGB7ciwgQ28gY29sbGFib3JhdGlvbiBuZXR3b3JrLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9Ck0gPC0gbWV0YVRhZ0V4dHJhY3Rpb24oTSwgRmllbGQgPSAiQVVfQ08iLCBzZXAgPSAiOyIpCk5ldE1hdHJpeCA8LSBiaWJsaW9OZXR3b3JrKE0sIGFuYWx5c2lzID0gImNvbGxhYm9yYXRpb24iLCAgbmV0d29yayA9ICJjb3VudHJpZXMiLCBzZXAgPSAiOyIpCm5ldD1uZXR3b3JrUGxvdChOZXRNYXRyaXgsICBuID0gZGltKE5ldE1hdHJpeClbMV0sIFRpdGxlID0gIkNvdW50cnkgY29sbGFib3JhdGlvbiIsdHlwZSA9ICJzcGhlcmUiLCBzaXplPTEwLHNpemUuY2V4PVQsZWRnZXNpemUgPSAxLGxhYmVsc2l6ZT0wLjYsIGNsdXN0ZXI9Im5vbmUiKQpgYGAKCkRlc2NyaXB0aXZlIGFuYWx5c2lzIG9mIGNvdW50cnkgY29sbGFib3JhdGlvbiBuZXR3b3JrIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgQ28gY29sbCBzdGF0LCBjb21tZW50PU5BfQpuZXRzdGF0IDwtIG5ldHdvcmtTdGF0KE5ldE1hdHJpeCkKc3VtbWFyeShuZXRzdGF0LGs9MTUpCmBgYAoKCgoKCgoK